package com.clh.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;

/**
 * 专门用于下载服务器中文件控制器
 */
@WebServlet("/FileDownloadServlet")
public class FileDownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 接收请求参数
		String type = request.getParameter("type");	        // 下载的文件类型
		String fileName = request.getParameter("fileName");	// 下载的文件名
		
		// 定义存储文件的根目录
		String root = "";
		// 通过参数type区分根目录
		if ("image".equals(type)) {
			root = "E:\\upload\\image\\"; 
		} else if("txt".equals(type)){
			root = "E:\\upload\\txt\\";
		} else if("video".equals(type)){
			root = "E:\\upload\\video\\";
		}
		
		// 定义要下载的文件的完整路径
		StringBuffer path = new StringBuffer();
		path.append(root).append(fileName); // E:\\upload\\image\\154fe6ab-7759-4e33-9b90-73ecc238d951.jpg
		
		// 关联文件
		File file = new File(path.toString());
		
		// 判断关联文件是否存在
		if (file.exists()) {
			// 读取
			// 利用字节输入流读取文件
			FileInputStream fis = new FileInputStream(file);
			// 利用字节输出流
			ByteOutputStream bos = new ByteOutputStream();
			
			// 字节数组
			byte[] b = new byte[1024];
			int n;
			while((n = fis.read(b)) != -1) { // 有数据可读
				bos.write(b, 0, n); // 写
			}
			
			// 设置响应编码格式
			response.setCharacterEncoding("utf-8");
			// 设置响应头,Content-Disposition 响应头指示回复的内容该以何种形式展示，是以内联的形式（即网页或者页面的一部分），还是以附件的形式下载并保存到本地
			response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
			
			// 通过response对象得到Servlet输出流将文件以字节形式输出到网页中
			ServletOutputStream sos = response.getOutputStream();
			sos.write(bos.getBytes());
			
			// 关闭流
			bos.close();
			fis.close();		
		}
		
	}
}
